package com.example.springmvcdemo.controller;

import com.example.springmvcdemo.entity.UserInfo;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.HashMap;

//随着互联网的发展，目前项目开发流行"前后端分离"模式，Java主要是用来做后端项目的开发
//所以也就不再处理前端相关的内容了MVC的概念也逐渐发生了变化，View不再返回视图，而是返回显示视图时需要的数据
//之前的@RestController就是@Controller + @ResponseBody
//意思就是返回的都是数据
//现在的@Controller单独使用就相当于返回特定的文件,如果找不到这个文件路径,那么就会报错
//@Controller：定义一个控制器,Spring 框架启动时加载,把这个对象交给Spring管理
//@ResponseBody：定义返回的数据格式为非视图,返回一个text/html信息
//如果想返回视图的话, 只需要把@ResponseBody去掉就可以了, 也就是@Controller

@Controller
@RequestMapping("/return")
public class ReturnController {
    @RequestMapping("/r1")
    public String r1() {
        return "/index.html";
    }

    @ResponseBody
    @RequestMapping("/r2")
    public String r2() {
        return "/index.html";
    }

    //返回HTML片段
    //后端返回数据时, 如果数据中有HTML代码, 也会被浏览器解析
    //注意:get请求可以被浏览器进行缓存
    //post请求不能进行缓存
    @ResponseBody
    @RequestMapping("/r3")
    public String r3() {
        return "<h1>我是返回的片段</h1>";
    }

    //返回失败,原因如下
    //找不到<h1>我是返回的片段</h1>这个文件
    @RequestMapping("/r4")
    public String r4() {
        return "<h1>我是返回的片段</h1>";
    }

    //返回JSON字符串/自定义类型
    //Spring会根据我们的返回结果,动态的设置返回对应的类型,也就是response中Content-type
    @RequestMapping("/r5")
    @ResponseBody
    public UserInfo r5() {
        UserInfo userInfo = new UserInfo(18, "qing", 2);
        return userInfo;
    }

    //返回hash_map/自定义类型(JSON)
    @RequestMapping("/r6")
    @ResponseBody
    public HashMap<String, String> r6() {
        HashMap<String, String> hashMap = new HashMap<String, String>();
        hashMap.put("k1", "v1");
        hashMap.put("k2", "v2");
        return hashMap;
    }

    //返回js文件
    //观察header中的Content-Type: text/javascript
    @RequestMapping("/r7")
    public String r7() {
        return "/test.js";
    }

    //返回css文件
    //观察header中的Content-Type: text/css
    @RequestMapping("/r8")
    public String r8() {
        return "/test.css";
    }

    //设置状态码
    //状态码的设置,不影响页面的显示
    @RequestMapping("/r9")
    @ResponseBody
    public String r9(HttpServletResponse response) {
        response.setStatus(401);
        return "设置状态成功!";
    }

    //设置header中的Content-type                   //可以同步设置编码
    @RequestMapping(value = "/r10", produces = "application/json; charset=utf8")
    @ResponseBody
    public String r10() {
        return "{\"OK\":1}";
    }

    //自定义header
    @RequestMapping("/r11")
    @ResponseBody
    public String r11(HttpServletResponse response) {
        response.setHeader("myHeader", "myHeaderValue");
        return "设置header成功!";
    }
}
